<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    /*
        1.基本使用
            - async 关键字用于声明异步函数
            - 可以用在函数声明 函数表达式 箭头函数上
     */
    async function foo() {

    }

    let bar = async function () {
    }
    let baz = async () => {
    }

    class Qux {
        async qux() {
            
        }
    }
    
    /*
        2.async 的返回
            - 始终返回一个promise对象
                - 返回值会被Promise.resolve()包装成一个promise对象
     */
    // 2.1 不使用return,相等于返回undefined,和普通函数一样
    async function a1() {
        console.log(1)
    }
    a1();
    console.log(2)
    // 1 2 
    
    // 2.2 第二个例子,使用return
    async function a2() {
        console.log(3)
        return 5;
        // 等同于
        // return Promise.resolve(5)
    }
    a2().then(console.log);
    console.log(4); // 3  4  5
    
    // 2.3 在异步函数中抛出错误会返回拒绝的promise
    async function a3() {
        console.log(6)
        throw 8
    }
    a3().catch(console.log)
    console.log(7)  // 6 7 8
    
    // 2.4 拒绝promise的错误不会被异步函数捕获
    async function a4() {
        Promise.reject(9)
    }
    
    a4().catch(console.log);  // 报错
    
    
</script>
</body>
</html>